/*
    js类数组转化为数组的三种方法
    类数组定义：    
            拥有length属性，其他属性（索引）为非负数,
            不具备数组所具有的的方法，即非Array继承而来
            常见的类数组arguments和NodeList
*/

// Array.prototype.slice.call()
Array.prototype.slice = function(start, end) {
    var result = new Array();
    start = start || 0;
    end = end || this.length;  // 使用call之后this的指向了类数组对象
    for(var i = start; i < end; i++) {
        result.push(this[i]);
    }
    return result;
}

//  一个通用的转换函数
var toArray = function(s){  
try{  
    return Array.prototype.slice.call(s);  
} catch(e){  
        var arr = [];  
        for(var i = 0,len = s.length; i < len; i++){   
                arr[i] = s[i];   
        }  
            return arr;  
    }
}


// 扩展运算符 (...)  es6语法，可以将某些数据结构转化为数组  调用遍历器接口
// arguments对象的转换
function test() {
    var args = [...arguments];
}
// NodeList对象的转换
[...document.querySelectorAll('p')]


// Array.form()  
// 以将两类对象转为真正的数组：类数组对象和可遍历（iterable）对象（包括ES6新增的数据结构Set和Map)
var arrayLike = {
    '0':'a',
    '1':'b',
    '2':'c',
    length:3  // 必须存在，否则返回为空数组，大于则多余返回undefined
};
var arr = Array.from(arrayLike);//['a','b','c']

var ps = document.querySelectorAll('p');
Array.from(ps).forEach(function(item) {
    console.log(item);
})
//  arguments对象
function test() {
    console.log(Array.from(arguments));
}

//只要是部署了Iterator接口的数据结构，Array.from都能将其转换为数组
Array.from('hello');            //['h','e','l','l','o']

